package src.Aula09;

import java.util.*;

public class CollectionTester {

	public static void main(String[] args) {
		Collection<Integer> col1 = new ArrayList<>(), col2 = new LinkedList<>(), col3 = new HashSet(),
				col4 = new TreeSet();

		int[] dimensions = { 100, 500, 1000, 5000, 10000, 50000,100000 };

		double[] measurements;

		System.out.println("Collection: add (ms); search (ms); remove (ms)\n");

		for (int dimension : dimensions) {
			System.out.println("DIM = " + dimension);
			measurements = checkPerformance(col1, dimension);
			System.out.print(String.format("%s: %.2f; %.2f; %.2f\n", "ArrayList", measurements[0], measurements[1],
					measurements[2]));
			measurements = checkPerformance(col2, dimension);
			System.out.print(String.format("%s: %.2f; %.2f; %.2f\n", "LinkedList", measurements[0], measurements[1],
					measurements[2]));
			measurements = checkPerformance(col3, dimension);
			System.out.print(String.format("%s: %.2f; %.2f; %.2f\n", "HashSet", measurements[0], measurements[1],
					measurements[2]));
			measurements = checkPerformance(col4, dimension);
			System.out.print(String.format("%s: %.2f; %.2f; %.2f\n", "TreeSet", measurements[0], measurements[1],
					measurements[2]));
			System.out.println();
		}

	}

	private static double[] checkPerformance(Collection<Integer> col, int DIM) {
		double[] measurements = new double[3]; // [add, search, remove]
		double start, stop, delta;
// Add
		start = System.nanoTime(); // clock snapshot before
		for (int i = 0; i < DIM; i++)
			col.add(i);
		stop = System.nanoTime(); // clock snapshot after
		delta = (stop - start) / 1e6; // convert to milliseconds
		measurements[0] = delta;
// Search
		start = System.nanoTime(); // clock snapshot before
		for (int i = 0; i < DIM; i++) {
			int n = (int) (Math.random() * DIM);
			if (!col.contains(n))
				System.out.println("Not found???" + n);
		}
		stop = System.nanoTime(); // clock snapshot after
		delta = (stop - start) / 1e6; // convert nanoseconds to milliseconds
		measurements[1] = delta;
// Remove
		start = System.nanoTime(); // clock snapshot before
		Iterator<Integer> iterator = col.iterator();
		while (iterator.hasNext()) {
			iterator.next();
			iterator.remove();
		}
		stop = System.nanoTime(); // clock snapshot after
		delta = (stop - start) / 1e6; // convert nanoseconds to milliseconds
		measurements[2] = delta;

		return measurements; // [add, search, remove]
	}
}
